﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using BreukTrainer_EE_.BreukModel;

namespace BreukTrainer_EE_.Controller
{
    public class OpgaveController
    {
        private ProgrammeerbareBreukContainer breuken;
        private string[,] operanden;
        private static Random random = new Random((int)DateTime.Now.Ticks);
        private int aantalopgaves;
        private int aantalbreuken;

        public int AantalOpgaves
        {
            get
            {
                return aantalopgaves;
            }
            set
            {
                aantalopgaves = value;
            }
        }

        public int AantalBreuken
        {
            get
            {
                return aantalbreuken;
            }
            set
            {
                aantalbreuken = value;
            }
        }
        
        public ProgrammeerbareBreukContainer Breuken
        {
            get
            {
                return breuken;
            }
            set
            {
                breuken = value;
            }
        }

        public string[,] Operanden
        {
            get
            {
                return operanden;
            }
            set
            {
                operanden = value;
            }
        }

        public OpgaveController(int aopgaves, int abreuken)
        {
            breuken = new ProgrammeerbareBreukContainer();
            aantalbreuken = abreuken;
            aantalopgaves = aopgaves;
            operanden = new string[aopgaves,abreuken-1];
        }
        public void Add(Breuk breuk)
        {
            breuken.Add(breuk);
        }
        public void SetOperandOfOpgave(int opgave,string operand) {
            for (int i = 0; i < aantalbreuken-1; i++)
            {
                operanden[opgave, i]=operand;
            }
        }
        /// <summary>
        /// De 4 opgaves met de 4 basicoperands vullen
        /// </summary>
        public void BasicOpgaves() {
            SetOperandOfOpgave(0, "+");
            SetOperandOfOpgave(1, "-");
            SetOperandOfOpgave(2, "*");
            SetOperandOfOpgave(3, ":");
        }
        /// <summary>
        /// Voor elke opgave wordt er een random combinatie gemaakt
        /// </summary>
        public void RandomOpgaves()
        {
            for (int i = 0; i < aantalopgaves; i++)
            {
                for (int j = 0; j < aantalbreuken-1; j++)
                {
                    int opp = random.Next(1, 5);
                    switch (opp)
                    {
                        case 1: operanden[i, j] = "+";
                            break;
                        case 2: operanden[i, j] = "-";
                            break;
                        case 3: operanden[i, j] = "*";
                            break;
                        case 4: operanden[i, j] = ":";
                            break;
                    }
                }
            }
        }

        /// <summary>
        ///     eenvoudige functie die dient voor de eenvoudige bewerkingen
        /// </summary>
        /// <param name="operand">De operand die er over moet tussengetoond worden</param>
        /// <returns>De opgave als string met de meegegeven operand</returns>
        public string ToonOpgave(int opgave)
        {
            string res = breuken[0].ToString();
            for (int j = 1; j < aantalbreuken; j++)
            {
                res += " " + operanden[opgave,j-1] + " " + breuken[j].ToString();
            }
            return res;
        }
        public string ToonOplossing(int opgave)
        {
            string[] stroperand = new string[aantalbreuken - 1];
            for (int i=0; i < aantalbreuken - 1;i++ )
            {
                stroperand[i] = operanden[opgave, i];
            } 
            return Breuken.DoeBewerkingResult(stroperand);
        }
        public static List<Breuk> GenereerBreuken(int aantal, int ondergrens, int bovengrens)
        {
            List<Breuk> breukentemp = new List<Breuk>();
            for (int i = 0; i < aantal; i++)
            {
                Breuk breuk = Breuk.RandomBreuk(ondergrens, bovengrens);
                try
                {
                    Console.WriteLine(breuk);
                    breukentemp.Add(breuk);
                }
                catch (ArgumentOutOfRangeException)
                {
                    //als we de breuk niet kunnen toevoegen proberen we het opnieuw
                    i--;
                }
            }
            return breukentemp;
        }
        public void insertDetailOpgaves(Opdracht o) {
            for (int i = 0; i < aantalopgaves; i++)
            {
                OpdrachtDetail od = new OpdrachtDetail();
                od.OpgaveTekst=this.ToonOpgave(i);
                od.OplossingTekst = this.ToonOplossing(i);
                od.OpdrachtID = o.OpdrachtID;
                Accessor.insertOpdrachtDetail(od);                
            }
        }
    }
}
